Zurück in Fortgeschrittene ProgrammentwicklungWeiter in Fortgeschrittene ProgrammentwicklungSortierter Binärbaum Zusammenfassung ?

Die Bezeichnungen 'Erster' und 'Nächster' beim Zugriff auf die Einträge unseres Wörterbuchs beziehen sich auf die Ordnung bzw. die alphabetische Sortierung der Schlüsselbegriffe in einer Liste. Welches ist jedoch der erste Knoten in einer Baumstruktur, z.B. im Binärbaum im nächsten Bild? Und welcher Knoten ist in diesem Bild beispielsweise der Nachfolger des Elements 'knoten'? Zur Beantwortung dieser Fragen muss man definieren, was man unter einem sortierten Baum versteht:

Ein Binärbaum heisst sortiert, wenn für jeden Knoten k gilt, dass die Inhalte der Knoten des linken Asts alle kleiner und jene des rechten Asts alle grösser sind als der Inhalt von k selbst. Der Baum im Bild unten ist in diesem Sinne sortiert. Die sieben Begriffe lassen sich gemäss dieser Definition aber auch anders in einen Binärbaum einsortieren.

Aufgabe sortierter Binärbaum

Die Definition des sortierten Binärbaumes liefert ein Kriterium zur Entscheidung, ob ein Baum sortiert ist oder nicht. Sie liefert aber keine Vorschrift, wie man neue Elemente in einen Baum eintragen muss, so dass er sortiert bleibt. Als Vorschrift könnte man einfach alle möglichen freien Stellen im Baum ausprobieren und jedes Mal testen, ob der Baum danach immer noch gemäss Definition sortiert ist. Dabei wird man feststellen, dass es offensichtlich für ein gegebenes Element nur immer genau einen möglichen Platz gibt, so dass man die Suche abbrechen kann, sobald man eine geeignete Stelle gefunden hat. Das Verfahren ist jedoch sehr aufwändig. Zum einen muss jede Suche nach einer freien Stelle immer bei der Wurzel beginnen und den Verweisen folgen, da die Verweise keinen Rückweg beschreiben. Zum anderen muss die anschliessende Entscheidung, ob der Baum noch sortiert ist, gemäss Definition für jeden Knoten nachweisen, dass seine Unterbäume wirklich kleiner bzw. grösser sind.

Ein einfacheres Verfahren beginnt die Suche nach dem passenden freien Platz ebenfalls bei der Wurzel, entscheidet aber bereits unterwegs bei jedem Knoten, ob der linke oder rechte Weg zur richtigen Stelle führt. Die Entscheidung, welchem Ast man folgen soll, kann lokal, das heisst allein aufgrund des Inhalts des aktuellen Knotens getroffen werden. Ein Begriff, der kleiner ist als der des aktuellen Knotens muss in den linken Teilbaum eingefügt werden, da im rechten gemäss Definition nur grössere sein können. Umgekehrt muss ein Begriff, der grösser ist als der des aktuellen Knotens im rechten Teilbaum eingefügt werden. Sobald man eine freie Stelle erreicht hat, hat man die einzige mögliche Stelle zum Einfügen gefunden. Der folgende Entwurfscode beschreibt diesen Einfügealgorithmus:

FügeHinzu Begriff
  Falls Baum noch keinen Wurzelknoten hat
    erzeuge Wurzelknoten
    trage Begriff ein.
  sonst
    gehe zu Wurzelknoten
    Wiederhole bis Begriff = Begriff im aktuellen Knoten
      Falls Begriff < Begriff im aktuellen Knoten
        Falls Knoten keinen linken Nachfolger hat
          erzeuge linken Nachfolgerknoten
          trage Begriff ein
        gehe zu linkem Nachfolgerknoten.
      sonst
        Falls Knoten keinen rechten Nachfolger hat
          erzeuge rechten Nachfolgerknoten
          trage Begriff ein
        gehe zu rechtem Nachfolgerknoten.

Die erste Bedingung behandelt den Sonderfall, dass der Baum noch völlig leer ist. Alle anderen Fälle beginnen bei der Wurzel und folgen in der Schleife den Ästen solange, bis sie auf eine freie Stelle treffen. Nachdem das neue Blatt des Baumes erzeugt und mit dem Begriff gefüllt wurde, ist die Schleifenbedingung erfüllt und die Schleife bricht ab.

Aufgabe Einfügealgorithmus

©abo